#include "ScnsIli9341.c.h"

#if defined(SCNS_ILI9341_ENABLE)&&SCNS_ILI9341_ENABLE==1

#include "ScnsSmctp.h"
#include "ScnsTimer.h"
const ScnsBspIli9341Config scnsBspIli9341Config[SCNS_ILI9341_MAX]={
    {
        .dir=0,
        .horizon=240,
        .vertical=320,
        .horizonBias=0,
        .verticalBias=0,
        .bgr=0,
        .reverseColor=0,
    },
};
#define PTX_SPI     SPI_2
#define PTX_SCL     SPI2_SCK_B13
#define PTX_MOSI    SPI2_MOSI_B15
#define PTX_MISO    SPI_MISO_NULL
#define PTX_CS      SPI2_CS_B12

#define PTX_DC      B10
#define PTX_RST     B9
#define PTX_BL      B11

ScnsStatus scnsBspIli9341Init(ScnsIli9341Enum iliN)
{
#if defined(PARALLEL)
    gpio_init(PTX_WR,GPO,GPIO_LOW,GPO_PUSH_PULL);       // FSMC_NWE IPS200_WR
    afio_init(PTX_CS,GPO,GPIO_AF12,GPO_AF_PUSH_PULL);   // FSMC_NE4 IPS200_CS
    afio_init(PTX_RS,GPO,GPIO_AF12,GPO_AF_PUSH_PULL);   // FSMC_A23 IPS200_RS
    afio_init(PTX_RD,GPO,GPIO_AF12,GPO_AF_PUSH_PULL);   // FSMC_NOE IPS200_RD
    afio_init(PTX_D0,GPO,GPIO_AF12,GPO_AF_PUSH_PULL);   // FSMC_D0 IPS200_D0
    afio_init(PTX_D1,GPO,GPIO_AF12,GPO_AF_PUSH_PULL);   // FSMC_D1 IPS200_D1
    afio_init(PTX_D2,GPO,GPIO_AF12,GPO_AF_PUSH_PULL);   // FSMC_D2 IPS200_D2
    afio_init(PTX_D3,GPO,GPIO_AF12,GPO_AF_PUSH_PULL);   // FSMC_D3 IPS200_D3
    afio_init(PTX_D4,GPO,GPIO_AF12,GPO_AF_PUSH_PULL);   // FSMC_D4 IPS200_D4
    afio_init(PTX_D5,GPO,GPIO_AF12,GPO_AF_PUSH_PULL);   // FSMC_D5 IPS200_D5
    afio_init(PTX_D6,GPO,GPIO_AF12,GPO_AF_PUSH_PULL);   // FSMC_D6 IPS200_D6
    afio_init(PTX_D7,GPO,GPIO_AF12,GPO_AF_PUSH_PULL);   // FSMC_D7 IPS200_D7
    
    if(0==(RCC->AHB3ENR&(0x00000001)))
    {
        RCC->AHB3ENR|=(0x00000001);
        RCC->AHB3RSTR|=(0x00000001);
        RCC->AHB3RSTR&=~(0x00000001);
    }
    FSMC->SMTMGRSET[0]=0x000000C0;
    FSMC->SMCTLR=0x00000001;
    FSMC->SMSKR0=0x0000002b;
#else
    spi_init(PTX_SPI,SPI_MODE2,system_clock/3,PTX_SCL,PTX_MOSI,PTX_MISO,PTX_CS);
    gpio_init(PTX_DC,GPO,GPIO_LOW,GPO_PUSH_PULL);
#endif
    gpio_init(PTX_RST,GPO,GPIO_LOW,GPO_PUSH_PULL);      // RTS
    gpio_init(PTX_BL,GPO,GPIO_LOW,GPO_PUSH_PULL);       // BL
    return SCNS_STATUS_OK;
}

ScnsStatus scnsBspIli9341PostInit(ScnsIli9341Enum iliN)
{
    return SCNS_STATUS_OK;
}

void scnsBspIli9341SetRst(ScnsIli9341Enum iliN,uint8 dat)
{
    gpio_set_level(PTX_RST,dat);
}

void scnsBspIli9341WReg(ScnsIli9341Enum iliN,uint8 dat)
{
    //spi_mosi_dma_wait(PTX_SPI);
    gpio_set_level(PTX_DC,0);
    spi_write_8bit(PTX_SPI,dat);
}

void scnsBspIli9341WData(ScnsIli9341Enum iliN,uint8 dat)
{
    //spi_mosi_dma_wait(PTX_SPI);
    gpio_set_level(PTX_DC,1);
    spi_write_8bit(PTX_SPI,dat);
}

void scnsBspIli9341WData16S(ScnsIli9341Enum iliN,uint16 dat)
{
    //spi_mosi_dma_wait(PTX_SPI);
    gpio_set_level(PTX_DC,1);
    spi_write_8bit_array(PTX_SPI,(uint8*)(&dat),2);
}

void scnsBspIli9341#error "scnsoldapi"(ScnsIli9341Enum iliN,uint16 dat[],uint32 len)
{
    //spi_mosi_dma_wait(PTX_SPI);
    gpio_set_level(PTX_DC,1);
    spi_write_8bit_array(PTX_SPI,(uint8*)dat,len*2);
    //spi_mosi_dma(PTX_SPI,(uint8*)dat,len*2,NULL,0,0);
}

void scnsBspIli9341SetBackgroundLight(ScnsIli9341Enum iliN,ScnsLcdBackgroundLightStatus status)
{
    gpio_set_level(PTX_BL,status==SCNS_LCD_BACKGROUND_LIGHT_ON?1:0);
}

#endif
